package cn.chencq.jdbc;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

public class JdbcUtils {
	private static String driver = "com.mysql.jdbc.Driver";// 声明驱动类字符串

	private static String url = "jdbc:mysql://172.16.22.169:3306/mortgagebusiness?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";// 声明数据库连接字符串

	private static Connection con = null;// 声明数据库连接对象引用

	private static Statement stat = null;// 声明语句对象引用

	private static PreparedStatement psInsert = null;// 声明预编译语句对象引用

	private static ResultSet rs = null;// 声明结果集对象引用

	/* 得到数据库连接的方法 */
	public static Connection getConnection() {
		try {
			Class.forName(driver);// 加载驱动类
			con = DriverManager.getConnection(url, "root", "beebank");// 得到连接
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;// 返回连接
	}

	/* 关闭数据库连接的方法 */
	public static void closeCon() {
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			} // 如果结果集不为空关闭结果集并赋值null
			if (stat != null) {
				stat.close();
				stat = null;
			} // 如果语句对象不为空关闭语句对象并赋值null
			if (con != null) {
				con.close();
				con = null;
			} // 如果连接不为空关闭连接并赋值null
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/* 登陆验证 */
	public static boolean check(String user, String pwd) {
		boolean flag = false;
		try {
			con = JdbcUtils.getConnection();// 得到数据库连接
			stat = con.createStatement();// 创建语句对象
			rs = stat.executeQuery("select pwd from user where uid='" + user + "'");
			rs.next();
			String spwd = rs.getString(1);// 得到密码
			if (spwd.equals(pwd)) {
				flag = true;// 密码匹配，登陆成功
			}
		} catch (Exception e) {
			flag = false;// 有任何异常发生，登陆失败
		} finally {
			JdbcUtils.closeCon();
		} // 关闭数据库连接
		return flag;
	}

	/* 更新数据库 */
	public static int update(String sql) {
		int count = 0;// 声明返回值
		try {
			con = JdbcUtils.getConnection();// 得到数据库连接
			stat = con.createStatement();// 创建语句对象
			count = stat.executeUpdate(sql);// 执行更新
		} catch (Exception e) {
			e.printStackTrace();
			count = -1;// 更新失败返回值为-1
		} finally {
			JdbcUtils.closeCon();
		} // 关闭数据库连接
		return count;// 返回结果
	}

	/* 某条记录是否存在 */
	public static boolean isExist(String sql) {
		boolean flag = false;// 设置返回值
		try {
			con = JdbcUtils.getConnection();// 得到数据库连接
			stat = con.createStatement();// 创建语句对象
			rs = stat.executeQuery(sql);// 执行查询
			if (rs.next()) {
				flag = true;// 存在，设置返回值为true
			}
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;// 发生任何异常，置返回结果为false
		} finally {
			JdbcUtils.closeCon();
		} // 关闭数据库连接
		return flag;// 返回结果
	}

	/* 删除用户 */
	public static int delUser(String uid) {
		int count = 0;// 设置返回值
		Vector<String> vpid = new Vector<String>();// 存放pid的集合 一个用户对应多个联系人
		try {
			con = JdbcUtils.getConnection();// 得到数据库连接
			stat = con.createStatement();// 创建语句对象
			rs = stat.executeQuery("select pid from lxy where uid='" + uid + "'");// 得到每个联系人的ID
			while (rs.next()) {
				String pid = rs.getString(1);// 得到用户下的pid
				vpid.add(pid);// 添加进联系人集合
			}
			stat = con.createStatement();// 重新创建语句对象
			for (String s : vpid) {// 循环删除每个联系人的相册
				stat.executeUpdate("delete from photo where pid='" + s + "'");
			}
			// 在联系人lxy表中删除每个联系人
			count = stat.executeUpdate("delete from lxy where uid='" + uid + "'");
			// 在用户表中删除用户
			stat.executeUpdate("delete from user where uid='" + uid + "'");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeCon();
		} // 关闭数据库连接
		return count;// 返回删除了多少个联系人
	}

	/* 得到信息 */
	public static Vector<String> getPerInfo(String sql)//
	{
		Vector<String> pInfo = new Vector<String>();
		try {
			con = getConnection();// 得到数据库连接
			stat = con.createStatement();// 创建语句对象
			rs = stat.executeQuery(sql);// 执行查询
			while (rs.next()) {
				for (int i = 1; i < 10; i++) {
					pInfo.add(rs.getString(i));// 将联系人信息添加到返回向量
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeCon();
		} // 关闭数据库连接
		return pInfo;// 返回信息集合
	}

	public static void getTableMetaData() throws SQLException {
		try {
			// 1.建立连接
			con = JdbcUtils.getConnection();
			// 2.创建语句
			stat = con.createStatement();

			// 3.执行语句
			rs = stat.executeQuery("select * from b_loanrecheck_upload_flow");

			ResultSetMetaData data = rs.getMetaData();
			for (int i = 1; i <= data.getColumnCount(); i++) {
				// 获得所有列的数目及实际列数
				int columnCount = data.getColumnCount();
				// 获得指定列的列名
				String columnName = data.getColumnName(i);
				// 获得指定列的列值
				int columnType = data.getColumnType(i);
				// 获得指定列的数据类型名
				String columnTypeName = data.getColumnTypeName(i);
				// 所在的Catalog名字
				String catalogName = data.getCatalogName(i);
				// 对应数据类型的类
				String columnClassName = data.getColumnClassName(i);
				// 在数据库中类型的最大字符个数
				int columnDisplaySize = data.getColumnDisplaySize(i);
				// 默认的列的标题
				String columnLabel = data.getColumnLabel(i);
				// 获得列的模式
				String schemaName = data.getSchemaName(i);
				// 某列类型的精确度(类型的长度)
				int precision = data.getPrecision(i);
				// 小数点后的位数
				int scale = data.getScale(i);
				// 获取某列对应的表名
				String tableName = data.getTableName(i);
				// 是否自动递增
				boolean isAutoInctement = data.isAutoIncrement(i);
				// 在数据库中是否为货币型
				boolean isCurrency = data.isCurrency(i);
				// 是否为空
				int isNullable = data.isNullable(i);
				// 是否为只读
				boolean isReadOnly = data.isReadOnly(i);
				// 能否出现在where中
				boolean isSearchable = data.isSearchable(i);
				
				System.out.println(columnCount);
				System.out.println("获得列" + i + "的字段名称:" + columnName);
				System.out.println("获得列" + i + "的类型,返回SqlType中的编号:" + columnType);
				System.out.println("获得列" + i + "的数据类型名:" + columnTypeName);
				System.out.println("获得列" + i + "所在的Catalog名字:" + catalogName);
				System.out.println("获得列" + i + "对应数据类型的类:" + columnClassName);
				System.out.println("获得列" + i + "在数据库中类型的最大字符个数:" + columnDisplaySize);
				System.out.println("获得列" + i + "的默认的列的标题:" + columnLabel);
				System.out.println("获得列" + i + "的模式:" + schemaName);
				System.out.println("获得列" + i + "类型的精确度(类型的长度):" + precision);
				System.out.println("获得列" + i + "小数点后的位数:" + scale);
				System.out.println("获得列" + i + "对应的表名:" + tableName);
				System.out.println("获得列" + i + "是否自动递增:" + isAutoInctement);
				System.out.println("获得列" + i + "在数据库中是否为货币型:" + isCurrency);
				System.out.println("获得列" + i + "是否为空:" + isNullable);
				System.out.println("获得列" + i + "是否为只读:" + isReadOnly);
				System.out.println("获得列" + i + "能否出现在where中:" + isSearchable);
			}

		} finally {
			JdbcUtils.closeCon();
		}
	}

	public static void getTableInfo(String table) throws SQLException {
		DatabaseMetaData dbmd = null;
		String schema = "";
		try {
			con = JdbcUtils.getConnection();
			dbmd = con.getMetaData();
			schema = dbmd.getUserName();
			ResultSet resultSet = dbmd.getTables(null, "%", table, new String[] { "TABLE" });
			while (resultSet.next()) {
				String tableName = resultSet.getString("TABLE_NAME");
				System.out.println("列名,名称,数据类型");
				if (tableName.equals(table)) {
					rs = con.getMetaData().getColumns(null, schema, tableName, "%");
					while (rs.next()) {
						String colName = rs.getString("COLUMN_NAME");
						System.out.print(colName + ",");

						String remarks = rs.getString("REMARKS");
						System.out.print(remarks + ",");

						String dbType = rs.getString("TYPE_NAME");
						String colSize = rs.getString("COLUMN_SIZE");
						if ("VARCHAR".equals(dbType)) {
							System.out.print(dbType.toLowerCase() + "(" + colSize + ")");
						} else {
							System.out.print(dbType.toLowerCase());
						}
						System.out.println("");
					}
				}
			}
		} finally {
			JdbcUtils.closeCon();
		}
	}

	public static void main(String[] args) throws Exception {
		getTableInfo("b_s_warrant");
	}
}